﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
using service_desk_blred.Utils;
using System.Data.SqlClient;
using System.Data;
using System.Collections;
using MySql.Data.MySqlClient;

namespace service_desk_blred.Models
{
    #region Models
    public class FornecedorModel
    {
        [Required(ErrorMessage = "O Campo Nome do Fornecedor é obrigatório!")]
        [DisplayName("Nome do Fornecedor")]
        public string NomeFornecedor { get; set; }

        [Required(ErrorMessage = "Campo obrigatório!")]
        [DisplayName("Contato do Fornecedor")]
        public string ContatoFornecedor { get; set; }

        [Required(ErrorMessage = "Campo obrigatório!")]
        [DataType(DataType.PhoneNumber)]
        [DisplayName("Telefone do Fornecedor")]
        public string TelefoneFornecedor { get; set; }

        [Required(ErrorMessage = "Campo obrigatório!")]
        [DataType(DataType.EmailAddress)]
        [DisplayName("Email Contato do Fornecedor")]
        public string EmailFornecedor { get; set; }

        [DisplayName("Informações Adicionais")]
        public string InformacoesAdicionaisFornecedor { get; set; }
        
        public int idFornecedor { get; set; }

    }

    public class ListaFornecedorModel
    {
        public ListaFornecedorModel(List<FornecedorModel> list)
        {
            this.fornecedores = list;
        }

        public List<FornecedorModel> fornecedores { get; set; }

    }

    #endregion

    #region Service
    public class FornecedorService
    {

        public ResponseInfo registrar(FornecedorModel model)
        {

            String command = "INSERT INTO fornecedor (NOME_FORNECEDOR,CONTATO_FORNECEDOR,TELEFONE_FORNECEDOR,EMAIL_FORNECEDOR,INFORMACOES_ADICIONAIS) " +
                             "VALUES (@NomeFornecedor,@ContatoFornecedor,@TelefoneFornecedor,@EmailFornecedor,@InformacoesAdicionaisFornecedor)";

            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = command;
            cmd.Parameters.AddWithValue("@NomeFornecedor", model.NomeFornecedor);
            cmd.Parameters.AddWithValue("@ContatoFornecedor", model.ContatoFornecedor);
            cmd.Parameters.AddWithValue("@TelefoneFornecedor", model.TelefoneFornecedor);
            cmd.Parameters.AddWithValue("@EmailFornecedor", model.EmailFornecedor);

            if (model.InformacoesAdicionaisFornecedor == null) {
                model.InformacoesAdicionaisFornecedor = "";
            }

            cmd.Parameters.AddWithValue("@InformacoesAdicionaisFornecedor", model.InformacoesAdicionaisFornecedor);
            
            try
            {

                if (DataBase.ExecuteNonQuery(cmd) != 0)
                {
                    return new ResponseInfo(ResponseEntity.Sucesso);
                }
                else
                {
                    return new ResponseInfo(ResponseEntity.Erro, "Não foi possível realizar está operação.");
                }

            }

            catch (Exception e)
            {
                return new ResponseInfo(ResponseEntity.Erro, e.Message);
            }


        }

        public ResponseInfo update(FornecedorModel model)
        {

            String command = "UPDATE fornecedor SET NOME_FORNECEDOR = @NomeFornecedor, CONTATO_FORNECEDOR = @ContatoFornecedor , TELEFONE_FORNECEDOR = @TelefoneFornecedor ," +
            "EMAIL_FORNECEDOR = @EmailFornecedor , INFORMACOES_ADICIONAIS = @InformacoesAdicionaisFornecedor " +
            "WHERE ID_FORNECEDOR LIKE @idFornecedor";

            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = command;
            cmd.Parameters.AddWithValue("@NomeFornecedor", model.NomeFornecedor);
            cmd.Parameters.AddWithValue("@ContatoFornecedor", model.ContatoFornecedor);
            cmd.Parameters.AddWithValue("@TelefoneFornecedor", model.TelefoneFornecedor);
            cmd.Parameters.AddWithValue("@EmailFornecedor", model.EmailFornecedor);

            if (model.InformacoesAdicionaisFornecedor == null)
            {
                model.InformacoesAdicionaisFornecedor = "";
            }

            cmd.Parameters.AddWithValue("@InformacoesAdicionaisFornecedor", model.InformacoesAdicionaisFornecedor);
            cmd.Parameters.AddWithValue("@idFornecedor", model.idFornecedor);
            try
            {

                if (DataBase.ExecuteNonQuery(cmd) != 0)
                {
                    return new ResponseInfo(ResponseEntity.Sucesso);
                }
                else
                {
                    return new ResponseInfo(ResponseEntity.Erro, "Não foi possível realizar está operação.");
                }

            }

            catch (Exception e)
            {
                return new ResponseInfo(ResponseEntity.Erro, e.Message);
            }


        }

        public ResponseInfo excluir(FornecedorModel model)
        {
            String command = "DELETE FROM fornecedor WHERE ID_FORNECEDOR LIKE @idFornecedo";

            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = command;
            cmd.Parameters.AddWithValue("@idFornecedo", model.idFornecedor);

            try
            {

                if (DataBase.ExecuteNonQuery(cmd) != 0)
                {
                    return new ResponseInfo(ResponseEntity.Sucesso);
                }
                else
                {
                    return new ResponseInfo(ResponseEntity.Erro, "Não foi possível realizar está operação.");
                }

            }

            catch (Exception e)
            {
                return new ResponseInfo(ResponseEntity.Erro, e.Message);
            }


        }

        public ResponseInfo recuperarTodos()
        {
            String command = "SELECT * FROM fornecedor";

            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = command;

            MySqlConnection conn = DataBase.createConnection();
            conn.Open();
            cmd.Connection = conn;

            using (MySqlDataReader dr = cmd.ExecuteReader())
            {
                List<FornecedorModel> fornecedores = new List<FornecedorModel>();

                while (dr.Read())
                {
                    FornecedorModel model = new FornecedorModel();

                    model.idFornecedor = dr.GetInt32("ID_FORNECEDOR");
                    model.NomeFornecedor = dr.GetString("NOME_FORNECEDOR");
                    model.ContatoFornecedor = dr.GetString("CONTATO_FORNECEDOR");
                    model.EmailFornecedor = dr.GetString("EMAIL_FORNECEDOR");
                    model.TelefoneFornecedor = dr.GetString("TELEFONE_FORNECEDOR");
                    model.InformacoesAdicionaisFornecedor = dr.GetString("INFORMACOES_ADICIONAIS");

                    fornecedores.Add(model);
                }

                DataBase.closeConnection(conn);

                return new ResponseInfo(ResponseEntity.Sucesso, "", fornecedores);
            }

        }

        public ResponseInfo recuperarPorId(int id)
        {
            String command = "SELECT * FROM fornecedor WHERE ID_FORNECEDOR = @idFornecedo ";


            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = command;
            cmd.Parameters.AddWithValue("@idFornecedo", id);

            MySqlConnection conn = DataBase.createConnection();
            conn.Open();
            cmd.Connection = conn;

            using (MySqlDataReader dr = cmd.ExecuteReader())
            {

                FornecedorModel model = new FornecedorModel();
                
                while (dr.Read())
                {
                    model.idFornecedor = dr.GetInt32("ID_FORNECEDOR");
                    model.NomeFornecedor = dr.GetString("NOME_FORNECEDOR");
                    model.ContatoFornecedor = dr.GetString("CONTATO_FORNECEDOR");
                    model.EmailFornecedor = dr.GetString("EMAIL_FORNECEDOR");
                    model.TelefoneFornecedor = dr.GetString("TELEFONE_FORNECEDOR");
                    model.InformacoesAdicionaisFornecedor = dr.GetString("INFORMACOES_ADICIONAIS");
                    break;
                }

                DataBase.closeConnection(conn);

                return new ResponseInfo(ResponseEntity.Sucesso, "", model);
            }

        }
    }

    #endregion
}